package uri.controller;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import javax.annotation.Resource;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

import uri.model.BoardVO;
import uri.model.CommentVO;
import uri.model.MemberVO;
import uri.model.FileVO;
import uri.model.board.PublicListVO;
import uri.model.board.PublicService;

@Controller
public class PublicController {

	@Resource(name="publicServiceImpl")
	private PublicService publicService;
	
	private String path="C:\\java-kosta\\goodjob-workspace\\goodjob-ver1\\WebContent\\WEB-INF\\view\\fileupload\\";
	
	/**
	 * 박현종 6-26 11:33
	 * 글쓰기 페이지로 이동하는 메서드
	 */
	@RequestMapping("public/auth_writeBoardGo.do")
	public String writeBoard(){
		return "writeShareBoard.public";
	}
	
	/**
	 * 작성자 : 정기남 2014-06-24
	 * 메서드 설명 : 게시판 글쓰는 메서드
	 */
	@RequestMapping("public/auth_writeShareBoard.do")
	public ModelAndView writeBoard(BoardVO bvo,HttpSession session){
		MemberVO mvo = (MemberVO) session.getAttribute("loginMember");
		bvo.setMemberVO(mvo);
		publicService.boardWrite(bvo);
		
		//파일을 DB에 저장하는 구현부

		List<MultipartFile> fileList=bvo.getFiles();
		for(int i=0;i<fileList.size();i++){
			String orgFileName="";
			if(fileList.get(i)!=null){
				orgFileName=fileList.get(i).getOriginalFilename();
				System.out.println(orgFileName);
			}
			if(!orgFileName.equals("")){
				try {
					long now=System.currentTimeMillis();	
					String newFileName=now+"_"+orgFileName;
					FileVO fvo=new FileVO();
					fileList.get(i).transferTo(new File(path+newFileName));
					fvo.setNewFileName(newFileName);
					fvo.setOrgFileName(orgFileName);
					fvo.setId(mvo.getId());
					fvo.setTextNo(bvo.getNo());
					publicService.fileUpload(fvo);
					System.out.println("fileupload ok :"+newFileName);
				} catch (IllegalStateException | IOException e) {
					e.printStackTrace();
					System.out.println("파일 업로드 실패임");
				}
		}
		}
		return new ModelAndView("redirect:/public/auth_detailBoardNoHit.do?no="+bvo.getNo());
	}
	/**
	 * 박현종 6-23 15:25
	 *  no에 해당하는 게시물의 상세정보를 detail 페이지로 보내준다.
	 *  조회수를 증가시킨다.
	 */
	@RequestMapping("public/auth_detailBoard.do")
	public ModelAndView detailBoard(String no,@CookieValue(value="no",required=false)String cookieValue,
									HttpServletResponse response){ //no이름의 쿠키를 가져온다 
		System.out.println("detatilBoard.do 실행");
		
		if(cookieValue==null){//쿠키가 없으면 
			Cookie cookie = new Cookie("no","|"+no+"|"); 
			cookie.setMaxAge(60); //60초간 지속
			//쿠키를 생성하여준다 
			response.addCookie(cookie);
			publicService.hitUp(no); //조회수 증가
		}else{//쿠키가 있으면 
			if(cookieValue.indexOf(no)==-1){ //no가 쿠키의 요소에 없으면
				Cookie cookie = new Cookie("no",cookieValue+"|"+no+"|");
				cookie.setMaxAge(60); //60초간 지속
				response.addCookie(cookie);
				publicService.hitUp(no); //조회수 증가
			}
		}
		BoardVO bvo = publicService.detailBoard(no);
		
		return new ModelAndView("detail.public","bvo",bvo);
	}
	/**
	 * 박현종 6-23 17:05
	 *  no에 해당하는 게시물의 상세정보를 detail 페이지로 보내준다.
	 *  조회수를 증가시키지 않는다.
	 */
	@RequestMapping("public/auth_detailBoardNoHit.do")
	public ModelAndView detailBoardNoHit(String no){
		System.out.println("detailBoardNoHit.do 실행");
		BoardVO bvo = publicService.detailBoard(no);
		return new ModelAndView("detail.public","bvo",bvo);
	}
	/**
	 * 박현종 6-24 11:15
	 * no에 해당하는 게시물의 모든 댓글 가져오기 (Ajax)
	 */
	@RequestMapping("public/auth_getAllComment.do")
	@ResponseBody
	public ArrayList<CommentVO> getAllComment(String no){
		System.out.println("getAllComment.do 실행");
		return publicService.getAllComment(no);
	}
	/**
	 * 박현종 6-24	1:29
	 *  댓글등록하는 메서드 (ajax)
	 */
	@RequestMapping("public/auth_writeComment.do")
	@ResponseBody
	public boolean writeComment(CommentVO cvo){
		System.out.println("댓글등록 : "+cvo);
		int index = publicService.writeComment(cvo); //댓글을 등록하고 해당 no 값을 반환받는다
		boolean flag = false;
		if(index>0){ //반환값이 0이상인 경우 (등록된경우)
			flag=true; //true를 반환
		}
		return flag;
	}
	/**
	 * 박현종 6-26 11:18
	 * 현재페이지에 해당하는 게시글을 리스트 형태로 반환
	 */
	@RequestMapping("public/getPublicBoardList.do")
	public ModelAndView getPublicBoardList(String nowPage){
		PublicListVO plvo = publicService.getPublicBoardList(nowPage);
		
		return new ModelAndView("publicBoardList.public","plvo",plvo);
	}
	/**
	 * 박현종 6-26 14:56
	 * no에 해당하는 게시글을 삭제하는 메서드
	 */
	@RequestMapping("public/auth_deleteBoardByPubNo.do")
	public ModelAndView deleteBoardByPubNo(String no){
		System.out.println("deleteBoardByPubNo.do 실행");
		publicService.deleteFileNameByPubNo(no, path); //게시물의 파일을 삭제
		publicService.deleteBoardByPubNo(no); //게시물삭제 
		return new ModelAndView("redirect:/public/getPublicBoardList.do");
	}
	/**
	 * 박현종 6-26 17:19
	 * no에 해당하는 org파일이름과 new파일이름을 json타입으로 반환 
	 * (ajax)
	 */
	@RequestMapping("public/auth_findOrgAndNewFileListByPubNo.do")
	@ResponseBody
	public ArrayList<HashMap> findOrgAndNewFileListByPubNo(String no){
		System.out.println("findOrgAndNewFileListByPubNo.do 실행");
		return (ArrayList<HashMap>) publicService.findOrgAndNewFileListByPubNo(no);
	}
	/**
	 * 박현종 6-26 17:42
	 * 파일 다운로드를 위한 메서드
	 */
	@RequestMapping("public/auth_fileDownload.do")
	public ModelAndView fileDownload(String newfilename,String orgfilename){
		System.out.println("fileDownload.do 실행");
		System.out.println(newfilename);
		HashMap map = new HashMap();
		map.put("path", path);
		map.put("newfilename", newfilename);
		map.put("orgfilename", orgfilename);
		return new ModelAndView("downloadView",map);
	}
	/**
	 * 박현종 6-26 12:46
	 * 댓글 삭제하는 메서드 (ajax)
	 */
	@RequestMapping("public/auth_deleteComment.do")
	@ResponseBody
	public boolean deleteComment(String no){
		System.out.println("deleteComment.do 실행");
		publicService.deleteComment(no);
		return true;
	}
	/**
	 * 박현종 6-27 15:03
	 * 댓글을 수정하는 메서드 (ajax)
	 */
	@RequestMapping("public/auth_updateComment.do")
	@ResponseBody
	public boolean updateComment(String no, String content){
		System.out.println("updateComment.do 실행");
		HashMap map = new HashMap();
		map.put("no", no);
		map.put("content", content);
		publicService.updateComment(map);
		return true;
	}
	/**
	 * 박현종 6-30 10:15
	 * 답글달기 페이지에 표시하기위해
	 * 원본게시글 정보를 조회하는 메서드
	 */
	@RequestMapping("public/auth_replyBoardWriteInfo.do")
	public ModelAndView replyBoardWriteInfo(String no){
		System.out.println("replyBoardWriteInfo.do 실행");
		BoardVO bvo = publicService.replyBoardWriteInfo(no);
		return new ModelAndView("replyBoardWrite.public","bvo",bvo);
	}
	/**
	 * 박현종 6-30 11:02
	 * 답글등록하기
	 */
	@RequestMapping("public/auth_replyBoardWrite.do")
	public ModelAndView replyBoardWrite(BoardVO bvo, HttpSession session){
		System.out.println("replyBoardWrite.do 실행");
		MemberVO mvo = (MemberVO) session.getAttribute("loginMember");
		bvo.setMemberVO(mvo);
		publicService.replyBoardWrite(bvo);
		//파일을 DB에 저장하는 구현부

		List<MultipartFile> fileList=bvo.getFiles();
		for(int i=0;i<fileList.size();i++){
			String orgFileName="";
			if(fileList.get(i)!=null){
				orgFileName=fileList.get(i).getOriginalFilename();
				System.out.println(orgFileName);
			}
			if(!orgFileName.equals("")){
				try {
					long now=System.currentTimeMillis();	
					String newFileName=now+"_"+orgFileName;
					FileVO fvo=new FileVO();
					fileList.get(i).transferTo(new File(path+newFileName));
					fvo.setNewFileName(newFileName);
					fvo.setOrgFileName(orgFileName);
					fvo.setId(mvo.getId());
					fvo.setTextNo(bvo.getNo());
					publicService.fileUpload(fvo);
					System.out.println("fileupload ok :"+newFileName);
				} catch (IllegalStateException | IOException e) {
					e.printStackTrace();
					System.out.println("파일 업로드 실패임");
				}
		}
		}
		return new ModelAndView("redirect:/public/auth_detailBoardNoHit.do?no="+bvo.getNo());
	}
	
	/**
	 * 박현종 6-30 14:48
	 * 제목에 word가 포함된 게시물리스트 반환
	 */
	@RequestMapping("public/searchPublicBoardListByTitle.do")
	public ModelAndView searchPublicBoardListByTitle(String word,String nowPage){
		System.out.println("searchPublicBoardListByTitle.do 실행");
		String page = "findPublicBoardListByTitle.public";
		HashMap map = new HashMap();
		map.put("nowPage", nowPage);
		map.put("word", word);
		PublicListVO plvo = publicService.searchPublicBoardListByTitle(map);
		if(plvo.getList().size()==0){ //검색한 게시물의 수가 0일시
			page = "public/findPublicBoard_fail";
		}
		ModelAndView mv = new ModelAndView(page,"plvo",plvo);
		mv.addObject("word", word);
		return mv;
	}
	/**
	 * 박현종 6-30 16:15
	 * 내용에 word가 포함된 게시물리스트 반환
	 */
	@RequestMapping("public/searchPublicBoardListByContent.do")
	public ModelAndView searchPublicBoardListByContent(String word,String nowPage){
		System.out.println("searchPublicBoardListByContent.do 실행");
		String page = "findPublicBoardListByContent.public";
		HashMap map = new HashMap();
		map.put("nowPage", nowPage);
		map.put("word", word);
		PublicListVO plvo = publicService.searchPublicBoardListByContent(map);
		if(plvo.getList().size()==0){ //검색한 게시물의 수가 0일시
			page = "public/findPublicBoard_fail";
		}
		ModelAndView mv = new ModelAndView(page,"plvo",plvo);
		mv.addObject("word", word);
		return mv;
	}
	/**
	 * 박현종 6-30 16:15
	 * 제목이나 내용에 word가 포함된 게시물리스트 반환
	 */
	@RequestMapping("public/searchPublicBoardListByTitleAndContent.do")
	public ModelAndView searchPublicBoardListByTitleAndContent(String word,String nowPage){
		System.out.println("searchPublicBoardListByTitleAndContent.do 실행");
		String page = "findPublicBoardListByTitleAndContent.public";
		HashMap map = new HashMap();
		map.put("nowPage", nowPage);
		map.put("word", word);
		PublicListVO plvo = publicService.searchPublicBoardListByTitleAndContent(map);
		if(plvo.getList().size()==0){ //검색한 게시물의 수가 0일시
			page = "public/findPublicBoard_fail"; 
		}
		ModelAndView mv = new ModelAndView(page,"plvo",plvo);
		mv.addObject("word", word);
		return mv;
	}
	/**
	 * 박현종 7-01 11:20
	 * 게시물 수정 게시판으로 이동한다. 
	 */
	@RequestMapping("public/auth_updatePublicBoardInfo.do")
	public ModelAndView updatePublicBoardInfo(String no){
		System.out.println("updatePublicBoardInfo.do 실행");
		System.out.println(no);
		BoardVO bvo = publicService.updatePublicBoardInfo(no);
		ArrayList<HashMap> list = (ArrayList<HashMap>) publicService.findOrgAndNewFileListByPubNo(no);
		ModelAndView mv = new ModelAndView("updatePublicBoard.public","bvo",bvo);
		mv.addObject("list", list);
		mv.addObject("listLength", list.size());
		return mv;
	}
	/**
	 * 박현종 7-01 16:46
	 * 파일을 삭제한다. 
	 */
	@RequestMapping("public/auth_deletePublicBoardFile.do")
	@ResponseBody
	public boolean deletePublicBoardFile(String newfilename, String fileNo){
		System.out.println("deletePublicBoardFile.do 실행");
		File mFile = new File(path+newfilename);
		mFile.delete();//실제파일 삭제
		System.out.println(newfilename+" 파일삭제");
		publicService.deleteFileByFileNo(fileNo);
		return true;
	}
	/**
	 * 박현종 7-07 17:13
	 * 게시물을 수정하고 detail페이지로 이동시킨다.
	 */
	@RequestMapping("public/auth_updatePublicBoard.do")
	public ModelAndView updatePublicBoard(BoardVO bvo,HttpSession session){
		System.out.println("updatePublicBoard.do 실행");
		MemberVO mvo = (MemberVO) session.getAttribute("loginMember");
		bvo.setMemberVO(mvo);
		publicService.updatePublicBoard(bvo);
		//파일을 DB에 저장하는 구현부
				List<MultipartFile> fileList=bvo.getFiles();
				for(int i=0;i<fileList.size();i++){
					String orgFileName="";
					if(fileList.get(i)!=null){
						orgFileName=fileList.get(i).getOriginalFilename();
						System.out.println(orgFileName);
					}
					if(!orgFileName.equals("")){
						try {
							long now=System.currentTimeMillis();	
							String newFileName=now+"_"+orgFileName;
							FileVO fvo=new FileVO();
							fileList.get(i).transferTo(new File(path+newFileName));
							fvo.setNewFileName(newFileName);
							fvo.setOrgFileName(orgFileName);
							fvo.setId(mvo.getId());
							fvo.setTextNo(bvo.getNo());
							publicService.fileUpload(fvo);
							System.out.println("fileupload ok :"+newFileName);
						} catch (IllegalStateException | IOException e) {
							e.printStackTrace();
							System.out.println("파일 업로드 실패임");
						}
				}
				}
				return new ModelAndView("redirect:/public/auth_detailBoardNoHit.do?no="+bvo.getNo());
	}
	/**
	 * 박현종 7-11 13:59
	 *  no에 해당하는 게시물 추천하기
	 *  Ajax
	 */
	@RequestMapping("public/auth_updateLike.do")
	@ResponseBody
	public boolean updateLike(String no,@CookieValue(value="like",required=false)String cookieValue,
									HttpServletResponse response){ //no이름의 쿠키를 가져온다 
		boolean flag = true;
		if(cookieValue==null){//쿠키가 없으면 
			Cookie cookie = new Cookie("like","|"+no+"|"); 
			cookie.setMaxAge(86400); //24시간 지속
			//쿠키를 생성하여준다 
			response.addCookie(cookie);
			publicService.updateLike(no); //추천수 증가
		}else{//쿠키가 있으면 
			if(cookieValue.indexOf(no)==-1){ //no가 쿠키의 요소에 없으면
				Cookie cookie = new Cookie("like",cookieValue+"|"+no+"|");
				cookie.setMaxAge(86400); //24시간 지속
				response.addCookie(cookie);
				publicService.updateLike(no); //추천수 증가
			}else{//쿠키 요소가 있으면 
				flag = false;
			}
		}
		return flag;
	}
	
	
	
	
	
	
	
	
	
	
	
	
	
	
}//class